fix(skills): unbreak memory-ci and ship the five unsynced skills - #9
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThe PR adds JSON-LD, Sanity help-plugin, and UI comparison skill documentation, expands preparation and shipping workflow guidance, adds UI capture utilities, updates metadata, fixes Markdown fencing, and configures LF endings for Markdown files. ChangesJSON-LD skill
Sanity Markdown help
UI match skill
Workflow and formatting updates
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
loadSkills only globs skills/*, so the five skills under entries/skills/ never synced to anyone; the entry linter also flagged them as malformed entries, failing memory-ci on every PR. Also converts prep and ship-pr from CRLF to LF, which the frontmatter parser rejected as "missing YAML frontmatter".
b4d92a6 to
a2f94bd
Compare
There was a problem hiding this comment.
Actionable comments posted: 31
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@skills/json-ld/AGENTS.md`:
- Line 2319: Remove /careers and /jobs from the JobPosting pattern in
skills/json-ld/AGENTS.md at lines 2319-2319, retaining only /careers/[slug] and
/jobs/[slug]. Update the corresponding mapping in
skills/json-ld/rules/audit-project.md at lines 66-66 to apply only to individual
job-detail routes; route index pages through content analysis or manual review.
- Line 1539: Sanitize job.description with an allowlist before it reaches the
dangerouslySetInnerHTML render boundary. Update the component containing this
JSX to use the project’s existing HTML sanitizer if available, preserving only
the markup required for job descriptions; otherwise render structured content
instead of raw HTML.
- Around line 1461-1462: Update the JobPosting example’s validThrough value near
datePosted so it is not a fixed date that can become expired, using a dynamic
future closing date or a non-date placeholder while preserving valid JobPosting
markup.
In `@skills/json-ld/rules/_template.md`:
- Around line 12-13: Add one blank line after each of the When to Use, Common
Mistakes, and Validation headings in skills/json-ld/rules/_template.md (lines
12-13), skills/json-ld/rules/content-article.md (lines 12-13),
skills/json-ld/rules/content-blog-posting.md (lines 12-13),
skills/json-ld/rules/content-course.md (lines 12-13),
skills/json-ld/rules/content-event.md (lines 12-13),
skills/json-ld/rules/content-job-posting.md (lines 12-13),
skills/json-ld/rules/content-recipe.md (lines 12-13),
skills/json-ld/rules/ecom-product.md (lines 12-13),
skills/json-ld/rules/interactive-faq-page.md (lines 12-13),
skills/json-ld/rules/interactive-howto.md (lines 12-13),
skills/json-ld/rules/local-local-business.md (lines 12-13), and
skills/json-ld/rules/media-video-object.md (lines 12-13), preserving the
existing lists.
In `@skills/json-ld/rules/content-course.md`:
- Around line 104-114: Update the Course guidance in
skills/json-ld/rules/content-course.md (lines 104-114) to match current Google
documentation: do not mark provider as required or present price/format as
Google eligibility fields. In skills/json-ld/rules/content-event.md (lines
129-146), label the online-event example as schema.org-only and state that
Google Event rich results require a physical location. In
skills/json-ld/rules/interactive-faq-page.md (lines 2-23), revise the title,
impactDescription, and introduction to limit FAQ accordion claims to
authoritative government and health sites. In
skills/json-ld/rules/interactive-howto.md (lines 2-10), remove promises of
Google HowTo rich-result visibility.
In `@skills/json-ld/rules/content-job-posting.md`:
- Line 113: Sanitize job.description before passing it to
dangerouslySetInnerHTML in the job posting render, using the project’s existing
HTML sanitizer with an appropriate allowlist. Keep the rendered description
behavior while ensuring untrusted ATS/database content cannot inject arbitrary
markup or scripts.
- Around line 35-36: Update the validThrough value in the job-posting structured
data to derive from the posting’s closing date or replace it with a clearly
future placeholder, ensuring it is not already expired while preserving the
existing ISO timestamp format.
In `@skills/json-ld/rules/content-recipe.md`:
- Around line 112-124: The Recipe JSON-LD example in
skills/json-ld/rules/content-recipe.md (lines 112-124) must match the rendered
text content: either add rendered image, rating, and video fields or remove the
corresponding image, aggregateRating, and video entries. Apply the same
correction to skills/json-ld/rules/ecom-product.md (lines 84-102) by either
rendering the rating/review content or removing aggregateRating and review from
the JSON-LD.
In `@skills/json-ld/rules/ecom-product.md`:
- Line 80: Update the product offer guidance around priceValidUntil so the field
is emitted only when a genuine expiration date exists, rather than being
universally required. Replace the aging 2026-12-31 example and update the later
example to match the conditional behavior, revising the accompanying guidance
text accordingly.
In `@skills/json-ld/rules/local-local-business.md`:
- Around line 140-152: Update the `geo` row in the properties table to remain
Recommended and revise its description so it does not claim latitude and
longitude are required for local-pack placement. Update the related `Common
Mistakes` guidance to avoid presenting omitted `geo` as disqualifying, and
change the example coordinate values to use at least five decimal places.
In `@skills/json-ld/rules/nav-website.md`:
- Around line 3-4: Remove the outdated sitelinks search box promise and lower
the rule’s impact metadata in skills/json-ld/rules/nav-website.md (lines 3-4).
Update skills/json-ld/AGENTS.md (lines 287-383) to retain WebSite
semantic/site-name guidance while removing sitelinks guarantees from the
description, property table, and mistakes; replace the result claim in
skills/json-ld/SKILL.md (lines 52-57); and remove the promised implementation
outcome from skills/json-ld/rules/audit-project.md (lines 130-134).
In `@skills/json-ld/rules/org-organization.md`:
- Around line 12-15: Correct Organization guidance across
skills/json-ld/rules/org-organization.md lines 12-15 and 86-103 and
skills/json-ld/AGENTS.md lines 73-76 and 147-164: recommend placing Organization
markup on one relevant home/about page instead of every page or the root layout,
state that no Organization properties are required, and allow logo values as
either a URL or ImageObject while marking applicable properties as recommended.
In `@skills/json-ld/SKILL.md`:
- Around line 59-65: The FAQPage entry in skills/json-ld/SKILL.md (lines 59-65)
must no longer be classified as HIGH for most sites; qualify it for
authoritative government and health sites and lower its generic priority. In
skills/json-ld/rules/audit-project.md (lines 140-144), add an eligibility check
before recommending FAQPage for rich-result outcomes.
- Around line 67-74: Remove the HowTo row’s “Step-by-step rich result” promise
from the priority table in skills/json-ld/SKILL.md at lines 67-74. In
skills/json-ld/AGENTS.md lines 1045-1196, revise the HowTo outcome and
validation guidance to present it as optional semantic markup rather than a
MEDIUM-priority Google rich-result implementation; preserve guidance for
supported schema validation.
In `@skills/prep/SKILL.md`:
- Line 61: Add a language identifier to the fenced example in SKILL.md, using
markdown (or another appropriate identifier) immediately after the opening fence
to satisfy markdownlint rule MD040.
- Around line 31-36: Update the branch setup instructions around the custom
branch validation and “B. Create and checkout the branch” so `git fetch origin`
runs before checking `origin/<provided-name>` with `git rev-parse --verify`.
Preserve the existing fallback to the local ref and error prompt, but ensure
validation uses freshly fetched remote refs.
In `@skills/sanity-plugin-md-notes/AUTHORING.md`:
- Around line 150-163: Fix the closing fence placement in the example template
around the Related and Walkthrough sections: remove the premature outer fence
before ## Related and use a single four-backtick fence after the Loom URL to
close the entire template, leaving no empty fenced block.
In `@skills/sanity-plugin-md-notes/OPT-IN.md`:
- Around line 133-144: Markdown fenced code blocks lack language identifiers and
trigger MD040. Mark the flowchart fence in
skills/sanity-plugin-md-notes/OPT-IN.md lines 133-144 as text, the command fence
in skills/sanity-plugin-md-notes/WEBPACK.md lines 88-90 as sh, and the path-only
fence in skills/sanity-plugin-md-notes/WEBPACK.md lines 104-106 as text.
In `@skills/sanity-plugin-md-notes/SKILL.md`:
- Around line 58-63: Update the “Static checks you run” guidance for withHelp
verification: search for any withHelp( occurrence in the target schema file
rather than requiring the single-line withHelp(<schemaName> pattern, then
inspect the surrounding code or AST to confirm the schema is wired and avoid
duplicate wrapping. Keep the other prescribed checks unchanged.
In `@skills/sanity-plugin-md-notes/VITE.md`:
- Around line 13-21: Update the vite.config.ts example to preserve the existing
Vite configuration and plugins, appending sanityHelpVite() to the current
plugins array rather than replacing it. Show the existing config structure as
retained while adding the new plugin.
- Around line 42-55: Update the VITE.md guidance so the step is skipped only
when "vite/client" is explicitly available through compilerOptions.types or a
/// <reference types="vite/client" /> declaration. Remove the instruction to
skip when compilerOptions.types is absent, and retain the existing instruction
to add "vite/client" when neither inclusion is present.
In `@skills/sanity-plugin-md-notes/WEBPACK.md`:
- Around line 79-90: Align the package scripts for dev, predev, and prebuild so
they all invoke codegen with the same custom --in and --out paths. Update the
watcher command and both lifecycle scripts consistently, preferably by reusing
one shared command to prevent path drift.
- Around line 35-40: Update the webpack configuration callback so the helpMdRule
is registered in the relevant oneOf branch when one exists, and only unshift it
into config.module.rules when no oneOf branch is available. Ensure each .help.md
file can match the rule only once and avoid adding the same rule through both
paths.
In `@skills/ship-pr/SKILL.md`:
- Around line 72-77: Update Step 6 of the ship-pr workflow to document recovery
when attaching the PR URL or moving the Linear ticket to “In Review” fails:
identify the failed operation, preserve the existing PR, and provide a sync-only
retry or manual remediation path that does not recreate or roll back the PR.
In `@skills/ui-match/references/linear.md`:
- Around line 34-44: Update the upload command in the prepare/upload flow to
capture and validate the HTTP status before embedding the returned assetUrl.
Treat any non-200 PUT response as a failed upload and retry or abort without
calling save_issue or referencing the dead assetUrl; preserve the existing
inline markdown behavior for successful uploads.
- Around line 3-7: Update the Linear MCP guidance in the referenced workflow
documentation to require discovering available Linear tools with
ToolSearch("+linear") before selecting or invoking a namespace. Replace the
hard-coded mcp__plugin_linear_linear__ references, including the authentication
fallback, with instructions that use the discovered tool names while preserving
the existing OAuth authentication flow.
- Around line 17-19: Update the Linear issue workflow described in the “Upload
each screenshot” section to reuse an existing ticket on reruns by looking up the
previously stored ticketUrl or ticketKey before creating a new issue, then
update that ticket instead of creating a duplicate. If reuse cannot be
supported, explicitly document that reruns intentionally create new issues.
In `@skills/ui-match/scripts/site_sections.js`:
- Around line 19-21: Update the section filtering logic in the visible-section
collection flow to retain visible elements with heights below 40px. Only exclude
zero-height or hidden elements, or replace the fixed threshold with an explicit
configurable threshold while preserving legitimate slim sections in the
inventory.
- Around line 7-8: Update the candidate selection and host setup around
candidates and host so inventory generation includes the full visible page shell
rather than preferring main alone. Merge visible header, main, and footer
sections in DOM order, or select the appropriate page-shell container, while
preserving the body fallback when no shell is available.
In `@skills/ui-match/SKILL.md`:
- Around line 25-26: Update the per-page setup instructions for SLUG in SKILL.md
to remove the existing /tmp/ui-match/$SLUG/figma and /tmp/ui-match/$SLUG/site
directories, including generated screenshots, before recreating them with mkdir
-p. Preserve the existing directory layout and ensure cleanup is scoped only to
the validated page.
- Around line 35-41: Update the Figma capture instructions in the “Get the Figma
pixels” section to fall back to the user-provided PNG for any MCP capture
failure, including unavailable tools, timeouts, permission errors, and non-image
responses. Preserve the requirement to retain the failure diagnostic while
continuing with PNG segmentation and Figma inventory creation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 0aac6271-747d-4341-ba2c-8c3791d93b8c
📒 Files selected for processing (40)
.gitattributesskills/json-ld/AGENTS.mdskills/json-ld/README.mdskills/json-ld/SKILL.mdskills/json-ld/metadata.jsonskills/json-ld/rules/_sections.mdskills/json-ld/rules/_template.mdskills/json-ld/rules/audit-project.mdskills/json-ld/rules/content-article.mdskills/json-ld/rules/content-blog-posting.mdskills/json-ld/rules/content-course.mdskills/json-ld/rules/content-event.mdskills/json-ld/rules/content-job-posting.mdskills/json-ld/rules/content-recipe.mdskills/json-ld/rules/ecom-product.mdskills/json-ld/rules/interactive-faq-page.mdskills/json-ld/rules/interactive-howto.mdskills/json-ld/rules/local-local-business.mdskills/json-ld/rules/media-video-object.mdskills/json-ld/rules/nav-breadcrumb-list.mdskills/json-ld/rules/nav-site-navigation.mdskills/json-ld/rules/nav-website.mdskills/json-ld/rules/org-organization.mdskills/json-ld/rules/org-person.mdskills/json-ld/rules/org-service.mdskills/prep/SKILL.mdskills/sanity-plugin-md-notes/AUTHORING.mdskills/sanity-plugin-md-notes/OPT-IN.mdskills/sanity-plugin-md-notes/SKILL.mdskills/sanity-plugin-md-notes/VITE.mdskills/sanity-plugin-md-notes/WEBPACK.mdskills/ship-pr/SKILL.mdskills/ui-match/README.mdskills/ui-match/SKILL.mdskills/ui-match/metadata.jsonskills/ui-match/references/capture.mdskills/ui-match/references/findings.mdskills/ui-match/references/linear.mdskills/ui-match/scripts/crop.shskills/ui-match/scripts/site_sections.js
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
🛑 Comments failed to post (31)
skills/json-ld/AGENTS.md (3)
1461-1462: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Do not publish an already-expired job example.
validThrough: '2026-06-15T23:59:59Z'is in the past as of July 22, 2026, while the sample still renders the job as active. Use a dynamic closing date or a non-date placeholder; Google disallows expired jobs remaining live withJobPostingmarkup. (developers.google.com)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/AGENTS.md` around lines 1461 - 1462, Update the JobPosting example’s validThrough value near datePosted so it is not a fixed date that can become expired, using a dynamic future closing date or a non-date placeholder while preserving valid JobPosting markup.
1539-1539: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Sanitize ATS/CMS HTML before rendering it.
This raw
dangerouslySetInnerHTMLis separate from the protected JSON-LD serialization. A malicious or compromised ATS/CMS description can inject active HTML (for example event handlers) into the page. Sanitize with an allowlist before this boundary, or render structured content instead.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/AGENTS.md` at line 1539, Sanitize job.description with an allowlist before it reaches the dangerouslySetInnerHTML render boundary. Update the component containing this JSX to use the project’s existing HTML sanitizer if available, preserving only the markup required for job descriptions; otherwise render structured content instead of raw HTML.
2319-2319: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Never classify careers/jobs indexes as
JobPosting. Google permitsJobPostingonly on a detailed page for one job, not job-listing or search-result pages. Keep it for the[slug]routes and send/careersand/jobsthrough content analysis/manual review instead. (developers.google.com)
skills/json-ld/AGENTS.md#L2319-L2319: remove/careersand/jobsfrom theJobPostingpattern.skills/json-ld/rules/audit-project.md#L66-L66: restrict the mapping to individual job-detail routes.📍 Affects 2 files
skills/json-ld/AGENTS.md#L2319-L2319(this comment)skills/json-ld/rules/audit-project.md#L66-L66🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/AGENTS.md` at line 2319, Remove /careers and /jobs from the JobPosting pattern in skills/json-ld/AGENTS.md at lines 2319-2319, retaining only /careers/[slug] and /jobs/[slug]. Update the corresponding mapping in skills/json-ld/rules/audit-project.md at lines 66-66 to apply only to individual job-detail routes; route index pages through content analysis or manual review.skills/json-ld/rules/_template.md (1)
12-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Add blank lines after headings before lists.
markdownlint-cli2reports MD022 for theWhen to Use,Common Mistakes, andValidationheadings throughout these files. Add one blank line after each affected heading.
skills/json-ld/rules/_template.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/content-article.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/content-blog-posting.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/content-course.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/content-event.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/content-job-posting.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/content-recipe.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/ecom-product.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/interactive-faq-page.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/interactive-howto.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/local-local-business.md#L12-L13: fix all three list-oriented headings.skills/json-ld/rules/media-video-object.md#L12-L13: fix all three list-oriented headings.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 12-12: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below(MD022, blanks-around-headings)
📍 Affects 12 files
skills/json-ld/rules/_template.md#L12-L13(this comment)skills/json-ld/rules/content-article.md#L12-L13skills/json-ld/rules/content-blog-posting.md#L12-L13skills/json-ld/rules/content-course.md#L12-L13skills/json-ld/rules/content-event.md#L12-L13skills/json-ld/rules/content-job-posting.md#L12-L13skills/json-ld/rules/content-recipe.md#L12-L13skills/json-ld/rules/ecom-product.md#L12-L13skills/json-ld/rules/interactive-faq-page.md#L12-L13skills/json-ld/rules/interactive-howto.md#L12-L13skills/json-ld/rules/local-local-business.md#L12-L13skills/json-ld/rules/media-video-object.md#L12-L13🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/_template.md` around lines 12 - 13, Add one blank line after each of the When to Use, Common Mistakes, and Validation headings in skills/json-ld/rules/_template.md (lines 12-13), skills/json-ld/rules/content-article.md (lines 12-13), skills/json-ld/rules/content-blog-posting.md (lines 12-13), skills/json-ld/rules/content-course.md (lines 12-13), skills/json-ld/rules/content-event.md (lines 12-13), skills/json-ld/rules/content-job-posting.md (lines 12-13), skills/json-ld/rules/content-recipe.md (lines 12-13), skills/json-ld/rules/ecom-product.md (lines 12-13), skills/json-ld/rules/interactive-faq-page.md (lines 12-13), skills/json-ld/rules/interactive-howto.md (lines 12-13), skills/json-ld/rules/local-local-business.md (lines 12-13), and skills/json-ld/rules/media-video-object.md (lines 12-13), preserving the existing lists.Source: Linters/SAST tools
skills/json-ld/rules/content-course.md (1)
104-114: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '\n== content-course.md ==\n' sed -n '1,220p' skills/json-ld/rules/content-course.md printf '\n== content-event.md ==\n' sed -n '1,220p' skills/json-ld/rules/content-event.md printf '\n== interactive-faq-page.md ==\n' sed -n '1,120p' skills/json-ld/rules/interactive-faq-page.md printf '\n== interactive-howto.md ==\n' sed -n '1,120p' skills/json-ld/rules/interactive-howto.mdRepository: robotostudio/team-memory
Length of output: 18223
🌐 Web query:
Google structured data Course rich results ItemList provider requirement online course event location FAQPage HowTo rich results deprecated current documentation💡 Result:
As of July 22, 2026, the status of these Google structured data features is as follows: Course Rich Results Google continues to support Course structured data [1]. To be eligible for Course rich results (including the course info carousel), you must provide specific required properties, including name, description, and provider [2][3]. While the legacy "course list" markup remains supported, Google now recommends including detailed information—such as pricing, educational level, ratings, and length—using the Course type [1]. A key requirement for current eligibility is providing hasCourseInstance, which details specific offerings (e.g., online, onsite, or blended) [4][3]. ItemList (Carousel) Rich Results The ItemList structured data type is supported by Google to enable carousel-style rich results for specific content types, including Course, Movie, Recipe, and Restaurant [5][6][7]. To be eligible, you must include at least two items (using the ListItem type) within the ItemList container [5][7]. Each item must specify its position (1-based integer) and a canonical URL [5][7]. FAQPage and HowTo Rich Results Both FAQPage and HowTo rich results are fully deprecated [8][9][10]. - FAQPage: As of May 7, 2026, FAQ rich results no longer appear in Google Search [8][9]. Google has removed the FAQ search appearance, rich result reporting, and support in the Rich Results Test [9][10]. - HowTo: This feature is also deprecated and no longer appears in search results on either desktop or mobile [8][11]. - Status of Schema: While these specific rich result features have been removed, FAQPage and HowTo remain valid Schema.org types [9][10]. Google has stated that you are not required to proactively remove this structured data from your site, as it does not cause errors, even though it will not produce visible rich result enhancements in Google Search [11][9][10].
Citations:
- 1: https://developers.google.com/search/blog/2023/11/new-course-info-markup
- 2: https://developers.google.com/search/docs/appearance/structured-data/course
- 3: https://schemai.com/guides/course
- 4: https://www.capconvert.com/learn/blog/how-to-create-course-schema
- 5: https://developers.google.com/search/docs/appearance/structured-data/carousel
- 6: https://developers.google.cn/search/docs/appearance/structured-data/carousel
- 7: https://schemai.com/guides/carousel
- 8: https://developers.google.com/search/updates
- 9: https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/
- 10: https://www.seostrategy.co.uk/learn/faq-schema-deprecation-2026-rich-result-vs-schema/
- 11: https://developers.google.com/search/blog/2023/08/howto-faq-changes
🏁 Script executed:
#!/bin/bash set -euo pipefail python3 - <<'PY' from pathlib import Path for p in [ Path("skills/json-ld/rules/content-course.md"), Path("skills/json-ld/rules/content-event.md"), Path("skills/json-ld/rules/interactive-faq-page.md"), Path("skills/json-ld/rules/interactive-howto.md"), ]: text = p.read_text() print(p, "lines:", text.count("\n")+1) PYRepository: robotostudio/team-memory
Length of output: 370
🌐 Web query:
site:developers.google.com/search/docs structured data course rich results itemlist provider online course event virtual location FAQPage HowTo deprecated💡 Result:
As of July 22, 2026, there is no official documentation from Google declaring Course, FAQPage, HowTo, ItemList, or Provider structured data as deprecated for general schema usage. However, Google Search only provides special rich result appearances for specific, documented structured data types [1][2]. While these types may exist in the Schema.org vocabulary, they are only eligible for rich results if they are explicitly listed in the Google Search Central documentation for supported features [1][2]. If a specific schema type is not listed in the Google Search Gallery, Google does not currently provide a dedicated rich result appearance for it, regardless of whether the schema is technically valid for other search engines or services [1][3]. For any structured data implementation, you should prioritize the Google Search Central feature guides to confirm current support, as Google recommends relying on their documentation as the definitive source for Google Search behavior rather than Schema.org definitions [1][4]. You can test your markup using the Google Rich Results Test to see if a page is eligible for a specific search appearance [3]. Any markup not tied to a specific Google feature can still be used for general Schema.org validation using the Schema Markup Validator [3].
Citations:
- 1: https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
- 2: https://developers.google.com/search/docs/appearance/structured-data/search-gallery
- 3: https://developers.google.com/search/docs/appearance/structured-data
- 4: https://developers.google.com/search/docs/appearance/structured-data/sd-policies
🌐 Web query:
site:developers.google.com/search/docs/appearance/structured-data/event Google online event VirtualLocation OnlineEventAttendanceMode rich results💡 Result:
Google does not support virtualLocation or onlineEventAttendanceMode in its Event structured data for rich results [1]. According to official Google Search Central documentation, events must take place at a physical location to be eligible for event rich results [1]. Google explicitly states that virtual experiences without a real-world component are not supported [1]. For the location property, you must use a schema.org Place type with a defined address and name [1].
Citations:
🌐 Web query:
site:developers.google.com/search/blog FAQ rich results deprecated HowTo rich results deprecated Google Search Central💡 Result:
As of July 22, 2026, Google has significantly restricted the eligibility of FAQ and How-To rich results [1]. These features were not fully deprecated for all sites simultaneously, but rather underwent a process of reduced visibility and tightened criteria starting in 2023 [1]. FAQ Rich Results As of the changes announced in August 2023, FAQ rich results (powered by FAQPage structured data) are no longer shown regularly for most websites [1]. They are now limited to well-known, authoritative government and health websites [1]. While site owners may still have this structured data on their pages, it generally does not result in the FAQ rich result appearing in Search for sites outside of those specific categories [1]. How-To Rich Results How-To rich results (powered by HowTo structured data) were also restricted in 2023 [1]. Following an initial update that limited them to desktop devices, Google fully deprecated How-To rich results on September 13, 2023 [1]. They no longer appear in Google Search results on any device [1]. Recommendations for Site Owners Google has explicitly stated that there is no requirement to proactively remove FAQ or How-To structured data from your site [1]. Structured data that is not actively used for rich results does not cause technical issues for Google Search, though it will not provide the benefit of rich result display [1]. Google continues to simplify its search results page by phasing out various structured data types that provide less significant value [2].
Citations:
- 1: https://developers.google.com/search/blog/2023/08/howto-faq-changes
- 2: https://developers.google.com/search/blog/2025/06/simplifying-search-results
🌐 Web query:
site:developers.google.com/search/docs/appearance/structured-data/course Google Course rich results provider hasCourseInstance itemlist💡 Result:
Google Search Central documentation for Course rich results does not include hasCourseInstance as a supported or required property [1]. To implement Course list structured data, you must use the ItemList schema, which requires the itemListElement property along with ListItem objects containing position and url properties [1]. For a Course entity, Google specifies the following: - Required properties: description, name [1]. - Recommended properties: provider [1]. - List requirements: You must mark up at least three courses using the ItemList structure [1]. The property hasCourseInstance is not part of the Google-supported schema for Course rich results [1].
Citations:
Separate schema.org guidance from Google Search eligibility.
skills/json-ld/rules/content-course.md: align the Course section with Google’s current Course docs;providershouldn’t be presented as required, andprice/formatshouldn’t be described as Google eligibility fields.skills/json-ld/rules/content-event.md: keep the online-event example as schema.org markup only; Google Event rich results require a physical location and don’t support virtual-only events.skills/json-ld/rules/interactive-faq-page.md: update the title/impactDescription and intro copy so they no longer promise a Google FAQ accordion for general sites; that appearance is now limited to authoritative government and health sites.skills/json-ld/rules/interactive-howto.md: remove the Google rich-result promise; HowTo rich results are no longer shown in Search.📍 Affects 4 files
skills/json-ld/rules/content-course.md#L104-L114(this comment)skills/json-ld/rules/content-event.md#L129-L146skills/json-ld/rules/interactive-faq-page.md#L2-L23skills/json-ld/rules/interactive-howto.md#L2-L10🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/content-course.md` around lines 104 - 114, Update the Course guidance in skills/json-ld/rules/content-course.md (lines 104-114) to match current Google documentation: do not mark provider as required or present price/format as Google eligibility fields. In skills/json-ld/rules/content-event.md (lines 129-146), label the online-event example as schema.org-only and state that Google Event rich results require a physical location. In skills/json-ld/rules/interactive-faq-page.md (lines 2-23), revise the title, impactDescription, and introduction to limit FAQ accordion claims to authoritative government and health sites. In skills/json-ld/rules/interactive-howto.md (lines 2-10), remove promises of Google HowTo rich-result visibility.skills/json-ld/rules/content-job-posting.md (2)
35-36: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
sed -n '1,120p' skills/json-ld/rules/content-job-posting.mdRepository: robotostudio/team-memory
Length of output: 3679
🏁 Script executed:
python3 - <<'PY' from pathlib import Path p = Path('skills/json-ld/rules/content-job-posting.md') text = p.read_text() for i, line in enumerate(text.splitlines(), 1): if 25 <= i <= 50: print(f"{i:>4}: {line}") PYRepository: robotostudio/team-memory
Length of output: 1432
Use a future
validThroughvalue.
validThroughis hard-coded to2026-06-15T23:59:59Z, which is already expired; derive it from the posting’s closing date or use a clearly future placeholder.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/content-job-posting.md` around lines 35 - 36, Update the validThrough value in the job-posting structured data to derive from the posting’s closing date or replace it with a clearly future placeholder, ensuring it is not already expired while preserving the existing ISO timestamp format.
113-113: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Sanitize
job.descriptionbefore usingdangerouslySetInnerHTML.This value comes from an ATS/database and is written directly into the page. The JSON-LD escaping above does not protect this separate HTML sink; sanitize it with an allowlist or render trusted structured content.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/content-job-posting.md` at line 113, Sanitize job.description before passing it to dangerouslySetInnerHTML in the job posting render, using the project’s existing HTML sanitizer with an appropriate allowlist. Keep the rendered description behavior while ensuring untrusted ATS/database content cannot inject arbitrary markup or scripts.skills/json-ld/rules/content-recipe.md (1)
112-124: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '\n== content-recipe.md (around cited lines) ==\n' sed -n '1,220p' skills/json-ld/rules/content-recipe.md printf '\n== ecom-product.md (around cited lines) ==\n' sed -n '1,220p' skills/json-ld/rules/ecom-product.md printf '\n== structured-data related references ==\n' rg -n "structured data|JSON-LD|aggregateRating|VideoObject|reviewBody|visible page content|recipe image|Recipe example|Product example" skills -SRepository: robotostudio/team-memory
Length of output: 31607
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '\n== Recipe rule around common mistakes / guidance ==\n' sed -n '150,190p' skills/json-ld/rules/content-recipe.md printf '\n== Product rule around common mistakes / guidance ==\n' sed -n '120,150p' skills/json-ld/rules/ecom-product.md printf '\n== AGENTS recipe section ==\n' sed -n '1690,1810p' skills/json-ld/AGENTS.md printf '\n== AGENTS product section ==\n' sed -n '900,1045p' skills/json-ld/AGENTS.mdRepository: robotostudio/team-memory
Length of output: 12899
🌐 Web query:
Google structured data visible page content recipe product reviews aggregateRating video structured data match visible content💡 Result:
Google's primary requirement for structured data is that it must be a true and complete representation of the content visible to users on the page [1][2]. Implementing structured data that describes information not visible to the user is considered misleading and a violation of Google's spam policies, which can result in manual actions or the loss of rich result eligibility [1][2][3]. Key principles regarding visible content and structured data include: Visible Content Match: Structured data must describe the same information that a user sees on the rendered page [1][4]. For example, if you include Recipe or Product structured data with an aggregateRating property, the rating and review information must be clearly visible to users on that same page [1][5][3]. Similarly, if you mark up a video, that video must be present and watchable on the page [1][2]. Completeness: You must include all relevant information that is visible to users in your structured data [1][2]. For instance, if a page displays multiple reviews, you should mark up all of those reviews rather than a selective subset [1][2]. Prohibition of Hidden Data: Do not mark up content that is hidden from the user, even if the information is factually accurate [6]. Creating or using structured data to describe content that is not present or visible on the page is explicitly discouraged and constitutes a misuse of structured data [6][7][3]. These guidelines apply universally to all structured data types, including Recipe, Product, and VideoObject [1][2]. While Google can read structured data injected dynamically via JavaScript, it still requires that the final rendered page match the structured data provided [6][3]. Failure to align structured data with visible page content is a common trigger for penalties because it misleads users who expect to see the information described in the search results [2][3].
Citations:
- 1: https://developers.google.com/search/docs/appearance/structured-data/sd-policies
- 2: https://developers.google.cn/search/docs/appearance/structured-data/sd-policies
- 3: https://crawlsense.ai/blog/review-schema-markup
- 4: https://www.seroundtable.com/google-structured-data-match-visible-content-24822.html
- 5: https://developers.google.com/search/docs/appearance/structured-data/review-snippet
- 6: https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
- 7: https://crawlsense.ai/blog/schema-markup-seo
Keep the Recipe/Product JSON-LD matched to rendered content.
skills/json-ld/rules/content-recipe.md#L112-L124: this example emitsimage,aggregateRating, andvideo, but the page only renders text content. Either render those fields or remove them from JSON-LD.skills/json-ld/rules/ecom-product.md#L84-L102: this example emitsaggregateRatingandreview, but the page only renders the product name, description, and price. Either render the ratings/reviews or drop them from JSON-LD.📍 Affects 2 files
skills/json-ld/rules/content-recipe.md#L112-L124(this comment)skills/json-ld/rules/ecom-product.md#L84-L102🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/content-recipe.md` around lines 112 - 124, The Recipe JSON-LD example in skills/json-ld/rules/content-recipe.md (lines 112-124) must match the rendered text content: either add rendered image, rating, and video fields or remove the corresponding image, aggregateRating, and video entries. Apply the same correction to skills/json-ld/rules/ecom-product.md (lines 84-102) by either rendering the rating/review content or removing aggregateRating and review from the JSON-LD.skills/json-ld/rules/ecom-product.md (1)
80-80: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail # Inspect the referenced file and nearby sections. wc -l skills/json-ld/rules/ecom-product.md sed -n '1,220p' skills/json-ld/rules/ecom-product.mdRepository: robotostudio/team-memory
Length of output: 5023
🌐 Web query:
Google Search Central Product structured data priceValidUntil required optional offer expiry💡 Result:
The priceValidUntil property is an optional field in Google's Product structured data [1][2]. It is used to specify the date (in ISO 8601 format) after which a price is no longer available [1][2]. While it is not strictly required, it is recommended when applicable—particularly for sales, discounts, or other temporary price reductions—to ensure Google displays accurate and timely pricing information [2][3]. If you include the property, you should ensure the date is accurate; if the property indicates a past date, your product snippet or merchant listing may not display [1][4][2][5]. For context, other key properties like price and priceCurrency are fundamental for structured data to be effective, especially for merchant listing experiences [1][2][6]. If you see warnings regarding a "missing" priceValidUntil field in tools like the Rich Results Test, it is often a recommendation to improve the richness and accuracy of your data rather than a mandatory requirement that would prevent eligibility for all rich results [3].
Citations:
- 1: https://developers.google.cn/search/docs/appearance/structured-data/product-snippet
- 2: https://developers.google.com/search/docs/appearance/structured-data/product-snippet
- 3: https://feedarmy.com/kb/understanding-warning-pricevaliduntil-in-the-structured-data-data-testing-tool/
- 4: https://developers.google.cn/search/docs/appearance/structured-data/merchant-listing
- 5: https://developers.google.com/search/docs/appearance/structured-data/merchant-listing
- 6: https://support.google.com/merchants/answer/7353427?hl=en
🏁 Script executed:
#!/bin/bash set -euo pipefail sed -n '120,150p' skills/json-ld/rules/ecom-product.mdRepository: robotostudio/team-memory
Length of output: 1798
Make
priceValidUntilconditional and fix the guidance text.
priceValidUntilshould only be emitted when the offer has a real expiry, and the2026-12-31example will age out. Update the later example too, and avoid describing the field as universally required.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/ecom-product.md` at line 80, Update the product offer guidance around priceValidUntil so the field is emitted only when a genuine expiration date exists, rather than being universally required. Replace the aging 2026-12-31 example and update the later example to match the conditional behavior, revising the accompanying guidance text accordingly.skills/json-ld/rules/local-local-business.md (1)
140-152: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
sed -n '120,170p' skills/json-ld/rules/local-local-business.mdRepository: robotostudio/team-memory
Length of output: 2351
🌐 Web query:
Google Search Central local business structured data geo required recommended local pack latitude longitude💡 Result:
According to official Google Search Central documentation, the geo property—which includes latitude and longitude—is categorized as a recommended property for LocalBusiness structured data, not a required one [1][2]. Key technical requirements and best practices include: 1. Recommended vs. Required: While the address property is typically required to define the business location [1][2], the geo property is recommended [1][2][3]. Including it provides search engines with a precise pin-drop location, which is particularly beneficial for businesses in areas where addresses might be ambiguous or shared [3]. 2. Technical Specification: When you choose to implement the geo property, it must use the GeoCoordinates type [1][2]. Both the latitude and longitude properties are required within that GeoCoordinates object [1][2][4]. 3. Precision: Google specifies that for the latitude and longitude values, the precision must be at least 5 decimal places [1][2]. Providing as much structured data as possible—including recommended properties like geo—is encouraged by Google to increase the quality of the information provided to users [2].
Citations:
- 1: https://developers.google.com/search/docs/appearance/structured-data/local-business
- 2: https://developers.google.cn/search/docs/appearance/structured-data/local-business
- 3: https://www.karpi.studio/schema-glossary-terms/geo
- 4: https://www.schemaapp.com/schema-markup/how-to-do-schema-markup-for-local-business/
🌐 Web query:
site:developers.google.com/search/docs local business structured data geo latitude longitude recommended required💡 Result:
For LocalBusiness structured data as defined by Google, the geo-coordinates (latitude and longitude) are considered recommended properties rather than required properties [1]. While they are not strictly required for eligibility to appear as a rich result, providing accurate geo-coordinates is recommended to add more information about your business and can improve how Google understands and presents your location data [1]. When you choose to include them: - They must be implemented within a GeoCoordinates object [1]. - Both latitude and longitude are required within that object if the geo property is used [1]. - The precision for both latitude and longitude must be at least 5 decimal places [1]. Always prioritize the official Google Search Central documentation for LocalBusiness structured data requirements, as Google's specific implementation needs may differ from the broader definitions found on schema.org [1][2]. Ensure that your business also includes all mandatory required properties—such as name, address, and telephone (where applicable)—to maintain eligibility for rich result display [1].
Citations:
- 1: https://developers.google.com/search/docs/appearance/structured-data/local-business
- 2: https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
🏁 Script executed:
rg -n "latitude|longitude|geo|coordinates|decimal" skills/json-ld/rules/local-local-business.mdRepository: robotostudio/team-memory
Length of output: 541
Make
georecommended, not required, and use higher-precision coordinates. The guidance overstatesgeoas needed for local-pack placement, and the examplelatitude/longitudevalues only use 4 decimal places; use at least 5.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 151-151: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below(MD022, blanks-around-headings)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/local-local-business.md` around lines 140 - 152, Update the `geo` row in the properties table to remain Recommended and revise its description so it does not claim latitude and longitude are required for local-pack placement. Update the related `Common Mistakes` guidance to avoid presenting omitted `geo` as disqualifying, and change the example coordinate values to use at least five decimal places.skills/json-ld/rules/nav-website.md (1)
3-4: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Stop promising a sitelinks search box. Google removed this Search UI on November 21, 2024;
SearchActionno longer enables it. KeepWebSiteguidance for its remaining semantic/site-name value, but remove the feature promise and reassess its CRITICAL priority. (developers.google.com)
skills/json-ld/rules/nav-website.md#L3-L4: revise the impact metadata.skills/json-ld/AGENTS.md#L287-L383: remove sitelinks-search-box guarantees from the description, property table, and mistakes.skills/json-ld/SKILL.md#L52-L57: replace the “Sitelinks search box” result claim.skills/json-ld/rules/audit-project.md#L130-L134: remove that promised implementation outcome.📍 Affects 4 files
skills/json-ld/rules/nav-website.md#L3-L4(this comment)skills/json-ld/AGENTS.md#L287-L383skills/json-ld/SKILL.md#L52-L57skills/json-ld/rules/audit-project.md#L130-L134🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/nav-website.md` around lines 3 - 4, Remove the outdated sitelinks search box promise and lower the rule’s impact metadata in skills/json-ld/rules/nav-website.md (lines 3-4). Update skills/json-ld/AGENTS.md (lines 287-383) to retain WebSite semantic/site-name guidance while removing sitelinks guarantees from the description, property table, and mistakes; replace the result claim in skills/json-ld/SKILL.md (lines 52-57); and remove the promised implementation outcome from skills/json-ld/rules/audit-project.md (lines 130-134).skills/json-ld/rules/org-organization.md (1)
12-15: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Correct the Organization requirements. Google has no required Organization properties, allows
logoas either a URL orImageObject, and recommends placing markup on the home/about page rather than every page. The current guidance contradicts both Google and this skill’s README example. (developers.google.com)
skills/json-ld/rules/org-organization.md#L12-L15: change “root layout/every page” to recommended single relevant page placement.skills/json-ld/rules/org-organization.md#L86-L103: mark properties as recommended when applicable and permit URL orImageObjectlogos.skills/json-ld/AGENTS.md#L73-L76: correct placement guidance.skills/json-ld/AGENTS.md#L147-L164: correct the required-property and logo-type claims.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 12-12: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below(MD022, blanks-around-headings)
📍 Affects 2 files
skills/json-ld/rules/org-organization.md#L12-L15(this comment)skills/json-ld/rules/org-organization.md#L86-L103skills/json-ld/AGENTS.md#L73-L76skills/json-ld/AGENTS.md#L147-L164🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/rules/org-organization.md` around lines 12 - 15, Correct Organization guidance across skills/json-ld/rules/org-organization.md lines 12-15 and 86-103 and skills/json-ld/AGENTS.md lines 73-76 and 147-164: recommend placing Organization markup on one relevant home/about page instead of every page or the root layout, state that no Organization properties are required, and allow logo values as either a URL or ImageObject while marking applicable properties as recommended.skills/json-ld/SKILL.md (2)
59-65: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Do not prioritize FAQPage for generic sites. Google limits FAQ rich results to well-known authoritative government and health sites, so calling it HIGH for “most sites” and promising an accordion produces misleading audit plans. (developers.google.com)
skills/json-ld/SKILL.md#L59-L65: qualify FAQ eligibility and lower its generic priority.skills/json-ld/rules/audit-project.md#L140-L144: require an eligibility check before recommending FAQPage for the rich-result outcome.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 59-59: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below(MD022, blanks-around-headings)
[warning] 60-60: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
🪛 SkillSpector (2.3.11)
[error] 44: [OH1] Unvalidated Output Injection: Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.
Remediation: Validate and sanitize all model output before using it in downstream contexts. Use parameterized queries for SQL, shell quoting for commands, and HTML encoding for web output.
(Output Handling (OH1))
📍 Affects 2 files
skills/json-ld/SKILL.md#L59-L65(this comment)skills/json-ld/rules/audit-project.md#L140-L144🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/SKILL.md` around lines 59 - 65, The FAQPage entry in skills/json-ld/SKILL.md (lines 59-65) must no longer be classified as HIGH for most sites; qualify it for authoritative government and health sites and lower its generic priority. In skills/json-ld/rules/audit-project.md (lines 140-144), add an eligibility check before recommending FAQPage for rich-result outcomes.
67-74: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Remove the HowTo rich-result promise. Google deprecated HowTo rich results and removed HowTo support from the Rich Results Test. Present this as optional semantic markup, not a MEDIUM-priority Google rich-result implementation. (developers.google.com)
skills/json-ld/SKILL.md#L67-L74: remove “Step-by-step rich result” from the priority table.skills/json-ld/AGENTS.md#L1045-L1196: revise the outcome and validation guidance.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 67-67: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below(MD022, blanks-around-headings)
[warning] 68-68: Tables should be surrounded by blank lines
(MD058, blanks-around-tables)
🪛 SkillSpector (2.3.11)
[error] 44: [OH1] Unvalidated Output Injection: Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.
Remediation: Validate and sanitize all model output before using it in downstream contexts. Use parameterized queries for SQL, shell quoting for commands, and HTML encoding for web output.
(Output Handling (OH1))
📍 Affects 2 files
skills/json-ld/SKILL.md#L67-L74(this comment)skills/json-ld/AGENTS.md#L1045-L1196🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/json-ld/SKILL.md` around lines 67 - 74, Remove the HowTo row’s “Step-by-step rich result” promise from the priority table in skills/json-ld/SKILL.md at lines 67-74. In skills/json-ld/AGENTS.md lines 1045-1196, revise the HowTo outcome and validation guidance to present it as optional semantic markup rather than a MEDIUM-priority Google rich-result implementation; preserve guidance for supported schema validation.skills/prep/SKILL.md (2)
31-36: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Fetch remote refs before validating custom branches.
Line [33] checks
origin/<provided-name>before Line [36] runsgit fetch origin. With stale local refs, an existing remote branch is incorrectly reported as missing and the user is asked again. Fetch before branch selection/validation, or fetch the requested ref directly.Proposed ordering fix
## Step 2: Create Git Branch +1. Run `git fetch origin` to ensure the latest refs. + **A. Ask for base branch.** ... -3. Option 3 (custom): use `origin/<provided-name>`. Verify it exists with `git rev-parse --verify origin/<branch>`. +3. Option 3 (custom): use `origin/<provided-name>`. Verify it exists with `git rev-parse --verify origin/<branch>`. ... -1. Run `git fetch origin` to ensure the latest refs.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.1. Run `git fetch origin` to ensure the latest refs. - Option 1 (Enter/main): use `origin/main`. - Option 2 (current): use `origin/<current-branch>`. If current branch has no remote tracking, use the local branch as base. - Option 3 (custom): use `origin/<provided-name>`. Verify it exists with `git rev-parse --verify origin/<branch>`. If not found, try the local ref. If neither exists, report the error and ask again. **B. Create and checkout the branch.**🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/prep/SKILL.md` around lines 31 - 36, Update the branch setup instructions around the custom branch validation and “B. Create and checkout the branch” so `git fetch origin` runs before checking `origin/<provided-name>` with `git rev-parse --verify`. Preserve the existing fallback to the local ref and error prompt, but ensure validation uses freshly fetched remote refs.
61-61: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add a language identifier to the fenced example.
markdownlint-cli2reports MD040 here. Use```markdown(or another appropriate language) instead of an unlabeled fence.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 61-61: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/prep/SKILL.md` at line 61, Add a language identifier to the fenced example in SKILL.md, using markdown (or another appropriate identifier) immediately after the opening fence to satisfy markdownlint rule MD040.Source: Linters/SAST tools
skills/sanity-plugin-md-notes/AUTHORING.md (1)
150-163: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Fix the example template’s closing fences.
The outer template closes at Line 150, so the
RelatedandWalkthroughsections render outside the example. Lines 161-163 then create an empty fenced block, which also triggers MD040.Proposed fix
-```` - ## Related @@ https://www.loom.com/share/<id> -``` - -``` +````📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.## Related - [Edit the homepage](/structure/intent/edit/id=homepage;type=page) - [Create a new article](/structure/intent/create/type=article) ## Walkthrough https://www.loom.com/share/<id>🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 161-161: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/sanity-plugin-md-notes/AUTHORING.md` around lines 150 - 163, Fix the closing fence placement in the example template around the Related and Walkthrough sections: remove the premature outer fence before ## Related and use a single four-backtick fence after the Loom URL to close the entire template, leaving no empty fenced block.Source: Linters/SAST tools
skills/sanity-plugin-md-notes/OPT-IN.md (1)
133-144: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add languages to all fenced code blocks.
These fences trigger MD040 and can fail documentation linting.
skills/sanity-plugin-md-notes/OPT-IN.md#L133-L144: mark the flowchart fence astext.skills/sanity-plugin-md-notes/WPACK.md#L88-L90: mark the command fence assh.skills/sanity-plugin-md-notes/WPACK.md#L104-L106: mark the path-only fence astext.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 133-133: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
skills/sanity-plugin-md-notes/OPT-IN.md#L133-L144(this comment)skills/sanity-plugin-md-notes/WEBPACK.md#L88-L90skills/sanity-plugin-md-notes/WEBPACK.md#L104-L106🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/sanity-plugin-md-notes/OPT-IN.md` around lines 133 - 144, Markdown fenced code blocks lack language identifiers and trigger MD040. Mark the flowchart fence in skills/sanity-plugin-md-notes/OPT-IN.md lines 133-144 as text, the command fence in skills/sanity-plugin-md-notes/WEBPACK.md lines 88-90 as sh, and the path-only fence in skills/sanity-plugin-md-notes/WEBPACK.md lines 104-106 as text.Source: Linters/SAST tools
skills/sanity-plugin-md-notes/SKILL.md (1)
58-63: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use a syntax-tolerant verification check for
withHelp().The prescribed search
withHelp(<schemaName>does not match the canonical multiline form shown inOPT-IN.md. An agent may falsely conclude the schema is unwired and wrap it twice. Check forwithHelp(in the target schema file, then inspect the surrounding AST/code manually.🧰 Tools
🪛 SkillSpector (2.3.11)
[warning] 20: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 20: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 22: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 22: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 23: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 24: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 24: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 25: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 25: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 26: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 27: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[warning] 27: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.
(Memory Poisoning (MP2))
[error] 69: [TM1] Tool Parameter Abuse: Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
Remediation: Validate all tool parameters against an allowlist. Reject dangerous parameter values (shell=True, --force, -rf /) and use safe defaults.
(Tool Misuse (TM1))
[error] 87: [TM1] Tool Parameter Abuse: Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
Remediation: Validate all tool parameters against an allowlist. Reject dangerous parameter values (shell=True, --force, -rf /) and use safe defaults.
(Tool Misuse (TM1))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/sanity-plugin-md-notes/SKILL.md` around lines 58 - 63, Update the “Static checks you run” guidance for withHelp verification: search for any withHelp( occurrence in the target schema file rather than requiring the single-line withHelp(<schemaName> pattern, then inspect the surrounding code or AST to confirm the schema is wired and avoid duplicate wrapping. Keep the other prescribed checks unchanged.skills/sanity-plugin-md-notes/VITE.md (2)
13-21: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Append
sanityHelpVite()instead of replacing existing Vite plugins.This example is presented as an edit to an existing
vite.config.ts, but assigningplugins: [sanityHelpVite()]removes any existing React, Sanity, or other Vite plugins. Show the plugin being appended to the existing array and explicitly preserve the rest of the config.Proposed fix
export default defineConfig({ - plugins: [sanityHelpVite()], + plugins: [ + // ...existing plugins + sanityHelpVite(), + ], })📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.import { defineConfig } from 'vite' import { sanityHelpVite } from 'sanity-plugin-md-notes/vite' export default defineConfig({ plugins: [ // ...existing plugins sanityHelpVite(), ], })🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/sanity-plugin-md-notes/VITE.md` around lines 13 - 21, Update the vite.config.ts example to preserve the existing Vite configuration and plugins, appending sanityHelpVite() to the current plugins array rather than replacing it. Show the existing config structure as retained while adding the new plugin.
42-55: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '\n== File context ==\n' sed -n '1,120p' skills/sanity-plugin-md-notes/VITE.md | cat -n printf '\n== Search for related tsconfig/types guidance ==\n' rg -n --hidden --glob '!**/.git/**' -S 'vite/client|compilerOptions.types|ImportMeta\.glob|tsconfig.json' skills || trueRepository: robotostudio/team-memory
Length of output: 5858
🌐 Web query:
Vite import.meta.glob type declarations compilerOptions.types vite/client triple-slash reference types💡 Result:
To ensure TypeScript recognizes Vite-specific features like import.meta.glob, you must include Vite's client-side type definitions in your project [1][2]. Vite provides these definitions via the vite/client package [1][3]. You can make these types available in your TypeScript configuration using one of the following two methods: Method 1: compilerOptions.types Add vite/client to the types array within your tsconfig.json file [1][4]: { "compilerOptions": { "types": ["vite/client"] } } Note: If you specify the types array, TypeScript will only include the listed packages in the global scope, excluding other visible
@typespackages [1][3]. Method 2: Triple-Slash Reference Alternatively, if you prefer not to modify compilerOptions.types or need to maintain existing type includes, you can use a triple-slash directive in a TypeScript declaration file (e.g., vite-env.d.ts) [5]: /// The vite/client definitions shim the environment for client-side code, providing types for: - The import.meta.glob function [4][2]. - Vite-injected constants on import.meta.env [1][3]. - The HMR API on import.meta.hot [1][3]. - Asset imports (e.g.,.svg,.css) [1][3][6]. If you are using custom type overrides for assets, ensure that your override declaration file is included in your tsconfig.json and that the reference to your override file precedes the reference to vite/client [5].Citations:
- 1: https://vite.dev/guide/features
- 2: https://futurestud.io/tutorials/vite-resolve-import-meta-glob-in-typescript
- 3: https://github.com/vitejs/vite/blob/f9d92130/docs/guide/features.md
- 4: https://stackoverflow.com/questions/76973229/cannot-set-options-on-vite-glob-import
- 5: https://github.com/vitejs/vite/blob/2eae24e1/docs/guide/features.md
- 6: https://github.com/vitejs/vite/blob/main/packages/vite/client.d.ts
Only skip when
vite/clientis already included
A missingcompilerOptions.typesarray doesn’t proveimport.meta.globtypes are available. Skip this step only ifvite/clientis present viacompilerOptions.typesor a/// <reference types="vite/client" />declaration.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/sanity-plugin-md-notes/VITE.md` around lines 42 - 55, Update the VITE.md guidance so the step is skipped only when "vite/client" is explicitly available through compilerOptions.types or a /// <reference types="vite/client" /> declaration. Remove the instruction to skip when compilerOptions.types is absent, and retain the existing instruction to add "vite/client" when neither inclusion is present.skills/sanity-plugin-md-notes/WEBPACK.md (2)
35-40: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
sed -n '1,140p' skills/sanity-plugin-md-notes/WEBPACK.mdRepository: robotostudio/team-memory
Length of output: 4885
🌐 Web query:
Webpack oneOf top-level rules and Next.js webpack config duplicate rule application semantics💡 Result:
In Webpack, the
oneOfproperty and therulesproperty define distinct behaviors for how modules are processed [1][2]. WebpackoneOfSemantics: TheoneOfproperty takes an array of rules [1][3]. Webpack iterates through these rules and applies only the first one that matches the module [1][3]. Once a match is found and applied, Webpack stops evaluating subsequent rules within thatoneOfblock [1][4]. This makesoneOfideal for conditional logic, such as using different loaders based on resource queries (e.g., handling a file differently if it has an?inline query vs. a default type) [1][5]. WebpackrulesSemantics: In contrast,rules(or nestedrules) within a parent rule are all evaluated [2]. If a module matches the parent rule, all rules defined in itsrulesarray are also checked and applied if they match, effectively allowing multiple loaders or rule configurations to be applied to the same module in sequence [2][5]. Next.js Webpack Configuration: Next.js provides awebpackfunction innext.config.jsthat allows you to extend the internal Webpack configuration [6]. When customizing this configuration: 1. Rule Extension: You typically push new rules toconfig.module.rules[6]. Because Next.js maintains its own complex set of internal loaders and rules, modifying these requires caution [6][7]. 2. Duplicate Application Risks: Next.js uses internal heuristics and explicit loader references to manage features like Fast Refresh and built-in CSS/Sass support [7][8][9]. If you manually push a rule that overlaps with or duplicates the functionality of an internal Next.js rule (e.g., adding a custombabel-loaderrule), you risk conflicts, duplicate module errors, or performance degradation [10][8][9]. 3. Best Practices: Next.js internal configuration often uses specific loader instances. When you need to wrap or extend these, it is safer to check the existing rules for specific loader matches (likedefaultLoaders.babel) rather than simply appending new, redundant rules to the main array [6][7][8]. If you encounter "duplicate module" errors, it is often because multiple rules are attempting to transform the same files, often due to wildcard matches or insufficiently specifictest/includeconditions [10][9]. Top Results: [1], [2], [6], [7], [8]Citations:
- 1: https://webpack.js.org/configuration/module/
- 2: webpack/webpack#8892
- 3: https://v4.webpack.js.org/configuration/module/
- 4: webpack/webpack#11262
- 5: https://docs.webpack.js.org/configuration/module
- 6: https://nextjs.org/docs/app/api-reference/config/next-config-js/webpack
- 7: https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack-config.ts
- 8: https://github.com/vercel/next.js/blob/v14.2.3/packages/next/src/build/webpack-config.ts
- 9: vercel/next.js#83131
- 10: vercel/next.js#81084
🌐 Web query:
webpack multiple matching rules same module asset/source oneOf top-level duplicate application💡 Result:
In Webpack, when multiple rules match the same module, the behavior depends on whether the rules are in a standard
rulesarray or wrapped in aoneOfblock [1][2]. Standard Rules Array When rules are defined in the top-levelmodule.rulesarray, Webpack evaluates all of them [3]. If multiple rules match a module, all matching rules will be applied [3]. This allows you to chain loaders or apply different configurations (such as parser settings) sequentially to the same file [3]. Rule.oneOf TheoneOfproperty is specifically designed to handle cases where you want to choose only one rule [1][4]. When a module matches aoneOfblock, Webpack iterates through the rules inside the array and applies only the first one that matches [1][5]. Subsequent matching rules within that sameoneOfblock are ignored [1][2]. This is frequently used for asset modules to select between different processing strategies (e.g., inlining vs. emitting a separate file) based on resource queries [1][5]. Duplicate Application If you accidentally have multiple top-level rules that both attempt to process the same file, Webpack will apply both sets of loaders or configurations [3]. For example, if you have two rules that both use the sameasset/sourcetype or different loaders for the same file extension, Webpack may process the file multiple times or throw errors if the configurations conflict [3]. To prevent this, useoneOfto ensure a single, mutually exclusive match, or use specific conditions (likeresourceQueryorexclude) to ensure that rules are targeted correctly and do not overlap unintentionally [5]. If you intended for a module to be processed by different rules, ensure that the rules are intended to be additive. If the goal is to choose one behavior, theoneOfconstruct is the authoritative way to enforce single-rule matching [1][5].Citations:
- 1: https://webpack.js.org/configuration/module/
- 2: https://webpack-js-org-git-patch-1.webpack-docs.vercel.app/configuration/module/
- 3: webpack/webpack#8892
- 4: https://v4.webpack.js.org/configuration/module/
- 5: https://webpack.js.org/guides/asset-modules/
Avoid registering the same
.help.mdrule in both paths.module.rulesentries are all evaluated, so unshifting this rule at the root and into everyoneOfcan make the same file match twice. Add it to the relevantoneOfbranch, and only fall back tomodule.ruleswhen nooneOfexists.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/sanity-plugin-md-notes/WEBPACK.md` around lines 35 - 40, Update the webpack configuration callback so the helpMdRule is registered in the relevant oneOf branch when one exists, and only unshift it into config.module.rules when no oneOf branch is available. Ensure each .help.md file can match the rule only once and avoid adding the same rule through both paths.
79-90: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Use the same codegen paths for
predev,prebuild, and the watcher.The custom-path example changes only
devto--in ./src/... --out ./src/..., whilepredevandprebuildstill run the default paths. This can leave the imported generated module missing or stale during development/builds.Define one shared command or repeat the identical
--in/--outflags in all three scripts.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 88-88: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/sanity-plugin-md-notes/WEBPACK.md` around lines 79 - 90, Align the package scripts for dev, predev, and prebuild so they all invoke codegen with the same custom --in and --out paths. Update the watcher command and both lifecycle scripts consistently, preferably by reusing one shared command to prevent path drift.skills/ship-pr/SKILL.md (1)
72-77: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Document a recovery path for failed Linear updates.
If attaching the PR or moving the ticket fails, merely warning leaves the PR and Linear state inconsistent; rerunning
/ship-prwill stop at Step 2 because the working tree is clean. Report which operation failed and provide a sync-only retry/manual remediation path without recreating or rolling back the PR.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 77-77: Files should end with a single newline character
(MD047, single-trailing-newline)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ship-pr/SKILL.md` around lines 72 - 77, Update Step 6 of the ship-pr workflow to document recovery when attaching the PR URL or moving the Linear ticket to “In Review” fails: identify the failed operation, preserve the existing PR, and provide a sync-only retry or manual remediation path that does not recreate or roll back the PR.skills/ui-match/references/linear.md (3)
3-7: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail printf 'Files:\n' git ls-files 'skills/ui-match/references/linear.md' 'skills/pr-review-orchestrator/SKILL.md' 'skills/**/SKILL.md' | sed -n '1,50p' printf '\nOutline linear.md:\n' ast-grep outline skills/ui-match/references/linear.md --view expanded || true printf '\nOutline pr-review-orchestrator/SKILL.md:\n' ast-grep outline skills/pr-review-orchestrator/SKILL.md --view expanded || true printf '\nSearch for Linear MCP tool references and ToolSearch:\n' rg -n 'ToolSearch|mcp__.*linear|plugin_linear|authenticate|namespace|Linear MCP' skills -SRepository: robotostudio/team-memory
Length of output: 3195
🏁 Script executed:
#!/bin/bash set -euo pipefail printf 'Files:\n' git ls-files 'skills/ui-match/references/linear.md' 'skills/pr-review-orchestrator/SKILL.md' 'skills/**/SKILL.md' | sed -n '1,80p' printf '\n--- linear.md ---\n' nl -ba skills/ui-match/references/linear.md | sed -n '1,120p' printf '\n--- pr-review-orchestrator/SKILL.md (first 240 lines) ---\n' nl -ba skills/pr-review-orchestrator/SKILL.md | sed -n '1,240p' printf '\n--- Search for Linear MCP tool references and discovery logic ---\n' rg -n 'ToolSearch|mcp__.*linear|plugin_linear|authenticate|Linear MCP|namespace' skills -SRepository: robotostudio/team-memory
Length of output: 437
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '%s\n' '--- skills/ui-match/references/linear.md ---' sed -n '1,80p' skills/ui-match/references/linear.md printf '\n%s\n' '--- skills/ui-match/README.md ---' sed -n '1,120p' skills/ui-match/README.md printf '\n%s\n' '--- skills/ui-match/SKILL.md ---' sed -n '1,160p' skills/ui-match/SKILL.md printf '\n%s\n' '--- skills/pr-review-orchestrator/SKILL.md (relevant section) ---' sed -n '55,85p' skills/pr-review-orchestrator/SKILL.mdRepository: robotostudio/team-memory
Length of output: 12933
Discover the Linear MCP tools before selecting a namespace.
skills/pr-review-orchestrator/SKILL.mdalready treats Linear tool names as variable (ToolSearch("+linear")), but this file hard-codesmcp__plugin_linear_linear__*. That will fail on installs using a different namespace and can block the auth fallback.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ui-match/references/linear.md` around lines 3 - 7, Update the Linear MCP guidance in the referenced workflow documentation to require discovering available Linear tools with ToolSearch("+linear") before selecting or invoking a namespace. Replace the hard-coded mcp__plugin_linear_linear__ references, including the authentication fallback, with instructions that use the discovered tool names while preserving the existing OAuth authentication flow.
17-19: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '\n## file outline\n' wc -l skills/ui-match/references/linear.md sed -n '1,140p' skills/ui-match/references/linear.md printf '\n## search identifiers\n' rg -n "ticketUrl|ticketKey|save_issue|Linear" skills -SRepository: robotostudio/team-memory
Length of output: 15139
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "== skills/ui-match/references/linear.md (1-140) ==" sed -n '1,140p' skills/ui-match/references/linear.md echo echo "== matches for ticketUrl / ticketKey / save_issue ==" rg -n "ticketUrl|ticketKey|save_issue|Linear" skills/ui-match -SRepository: robotostudio/team-memory
Length of output: 7663
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "== findings.json references ==" rg -n "findings\.json|ticketUrl|ticketKey" . echo echo "== ui-match skill docs around ticket filing ==" sed -n '40,80p' skills/ui-match/SKILL.mdRepository: robotostudio/team-memory
Length of output: 3208
🏁 Script executed:
#!/bin/bash set -euo pipefail sed -n '1,120p' skills/ui-match/references/findings.mdRepository: robotostudio/team-memory
Length of output: 1465
Reuse the stored Linear ticket on reruns.
ticketUrl/ticketKeyare only written after creation, andfindings.jsonis overwritten on reruns, so the same page will create duplicate Linear issues instead of updating the existing one. Look up the saved ticket first, or document that reruns intentionally create a new issue.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 17-17: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below(MD022, blanks-around-headings)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ui-match/references/linear.md` around lines 17 - 19, Update the Linear issue workflow described in the “Upload each screenshot” section to reuse an existing ticket on reruns by looking up the previously stored ticketUrl or ticketKey before creating a new issue, then update that ticket instead of creating a duplicate. If reuse cannot be supported, explicitly document that reruns intentionally create new issues.
34-44: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '--- file: skills/ui-match/references/linear.md (around lines 1-120) ---\n' nl -ba skills/ui-match/references/linear.md | sed -n '1,120p'Repository: robotostudio/team-memory
Length of output: 253
🏁 Script executed:
#!/bin/bash set -euo pipefail printf -- '--- file: skills/ui-match/references/linear.md (around lines 1-120) ---\n' nl -ba skills/ui-match/references/linear.md | sed -n '1,120p'Repository: robotostudio/team-memory
Length of output: 274
🏁 Script executed:
python3 - <<'PY' from pathlib import Path path = Path('skills/ui-match/references/linear.md') for i, line in enumerate(path.read_text().splitlines(), 1): if 1 <= i <= 120: print(f"{i:4d}: {line}") PYRepository: robotostudio/team-memory
Length of output: 5415
Stop on non-200 upload responses in
skills/ui-match/references/linear.md:34-44.curlonly prints the status code here, so a failed PUT can still flow intosave_issuewith a deadassetUrl; retry or abort before embedding the image.🧰 Tools
🪛 LanguageTool
[uncategorized] ~42-~42: Did you mean the formatting language “Markdown” (= proper noun)?
Context: .... Just reference the bareassetUrlin markdown:. When you `sa...(MARKDOWN_NNP)
🪛 markdownlint-cli2 (0.23.0)
[warning] 34-34: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 39-39: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ui-match/references/linear.md` around lines 34 - 44, Update the upload command in the prepare/upload flow to capture and validate the HTTP status before embedding the returned assetUrl. Treat any non-200 PUT response as a failed upload and retry or abort without calling save_issue or referencing the dead assetUrl; preserve the existing inline markdown behavior for successful uploads.skills/ui-match/scripts/site_sections.js (2)
7-8: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Include the full page shell, not only
<main>.Selecting
<main>unconditionally excludes visibleheaderandfootersiblings. The skill promises full-page parity, andfindings.mdeven usesFooteras a matched example. Build the inventory from the page shell, or merge visible header/main/footer sections in DOM order.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ui-match/scripts/site_sections.js` around lines 7 - 8, Update the candidate selection and host setup around candidates and host so inventory generation includes the full visible page shell rather than preferring main alone. Merge visible header, main, and footer sections in DOM order, or select the appropriate page-shell container, while preserving the body fallback when no shell is available.
19-21: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Do not discard visible sections solely because they are under 40px.
A slim announcement bar, navigation strip, or legal section can be a legitimate component. Skipping it removes it from the site inventory and can produce false missing findings. Filter zero-height/hidden nodes only, or make the threshold explicit and configurable.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ui-match/scripts/site_sections.js` around lines 19 - 21, Update the section filtering logic in the visible-section collection flow to retain visible elements with heights below 40px. Only exclude zero-height or hidden elements, or replace the fixed threshold with an explicit configurable threshold while preserving legitimate slim sections in the inventory.skills/ui-match/SKILL.md (2)
25-26: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Clear the per-page output before a rerun.
mkdir -ppreserves oldNN-*.pngandchunk-*.pngfiles. A rerun with fewer or renamed sections can therefore leave stale screenshots beside the new findings. Delete the validated page’sfigmaandsitedirectories, or clean generated files, before recreating them.🧰 Tools
🪛 SkillSpector (2.3.11)
[warning] 50: [RA2] Session Persistence: Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Remediation: Remove any persistence mechanisms (cron jobs, startup scripts, state files). Skills should not maintain state across sessions without explicit user consent.
(Rogue Agent (RA2))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ui-match/SKILL.md` around lines 25 - 26, Update the per-page setup instructions for SLUG in SKILL.md to remove the existing /tmp/ui-match/$SLUG/figma and /tmp/ui-match/$SLUG/site directories, including generated screenshots, before recreating them with mkdir -p. Preserve the existing directory layout and ensure cleanup is scoped only to the validated page.
35-41: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail # Inspect the relevant skill doc and the referenced capture guide. sed -n '1,140p' skills/ui-match/SKILL.md printf '\n--- capture.md ---\n' sed -n '1,220p' skills/ui-match/references/capture.mdRepository: robotostudio/team-memory
Length of output: 8034
🏁 Script executed:
#!/bin/bash set -euo pipefail # Find any other mentions of screenshot fallback / error handling in this skill. rg -n "fallback|permission|MCP|screenshot|PNG" skills/ui-match -SRepository: robotostudio/team-memory
Length of output: 4453
Use the PNG fallback for any MCP failure.
skills/ui-match/SKILL.md:35-41only falls back on access/permission errors. If the Figma tool is unavailable, times out, or returns a non-image/error response, the PNG export is ignored and the Figma inventory can’t be built. Fall back on any failed MCP capture and keep the diagnostic.🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 35-35: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below(MD022, blanks-around-headings)
🪛 SkillSpector (2.3.11)
[warning] 50: [RA2] Session Persistence: Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Remediation: Remove any persistence mechanisms (cron jobs, startup scripts, state files). Skills should not maintain state across sessions without explicit user consent.
(Rogue Agent (RA2))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skills/ui-match/SKILL.md` around lines 35 - 41, Update the Figma capture instructions in the “Get the Figma pixels” section to fall back to the user-provided PNG for any MCP capture failure, including unavailable tools, timeouts, permission errors, and non-image responses. Preserve the requirement to retain the failure diagnostic while continuing with PNG segmentation and Figma inventory creation.
The four-backtick fence closed early, so Related and Walkthrough escaped the example template and rendered as real headings, followed by an empty code block.
Problem / Intent
Five team skills lived under
entries/skills/, but the roboto-mem CLI only ever globs top-levelskills/*(src/core/skill.ts:118), so those skills had never reached a single teammate's~/.claude/skills/. Worse, the entry linter treats everything underentries/as a memory entry, so those directories produced 35 lint errors — andmemory-ci.ymlruns that linter on every pull request, so CI was red on every PR opened against this repo. This moves the five skills to the location the CLI actually reads and fixes the CRLF line endings that made two of them unparseable.Summary
json-ld,prep,sanity-plugin-md-notes,ship-pr, andui-matchfromentries/skills/to top-levelskills/, joiningpr-review-orchestratorwhich was already correctly placed.entries/now holds only the four real scopes:org,projects,squads,stacks. These six skills will materialize into teammates'~/.claude/skills/on their next session start after merge — for five of them, for the first time.skills/prep/SKILL.mdandskills/ship-pr/SKILL.mdfrom CRLF to LF. Both opened with---\r\n, andparseSkillFrontmatterrequiresraw.startsWith("---\n")(src/core/skill.ts:43), so both were rejected with a misleadingmissing YAML frontmatterdespite having valid frontmatter. They were the only two CRLF files in the repo..gitattributesso*.mdis normalized to LF on commit, preventing a Windows or misconfigured editor from reintroducing the same failure.node .roboto-mem/cli.mjs lintgoes from exit 1 with 35 errors to✓ 24 entries, 0 problems, exit 0. All 35 errors originated inentries/skills/**; none came from anywhere else.This is a content-only change. No CLI change is required, and no file's contents were rewritten — 37 of the 39 moves are byte-identical (
R100), and the two CRLF files hash identically to their originals once carriage returns are stripped.Core file changes
entries/skills/{json-ld,sanity-plugin-md-notes,ui-match}/**→skills/**R100) into the only directoryloadSkillsreadsentries/skills/prep/SKILL.md→skills/prep/SKILL.mdentries/skills/ship-pr/SKILL.md→skills/ship-pr/SKILL.md.gitattributes*.md text eol=lf, so CRLF cannot come backVerification
Run against the staged tree extracted in isolation (
git checkout-index -a --prefix=$TMP/), so it matches exactly what CI checks out.node .roboto-mem/cli.mjs lint— the exact commandmemory-ci.ymlruns →✓ 24 entries, 0 problems, exit 0. Baseline onmainin a throwaway worktree: exit 1, 35 errors, all 35 fromentries/skills/**.grep -rlU $'\r' --exclude-dir=.git .returns nothing.ls skills/lists all six:json-ld,pr-review-orchestrator,prep,sanity-plugin-md-notes,ship-pr,ui-match.ls entries/lists onlyorg,projects,squads,stacks.✓ 24 entries, 6 skills, 0 problems, exit 0. Onmainthe loader sees none of the five.roboto-mem syncon a bound machine reports 6 skills materialized.syncreads the clone at~/.roboto-mem/repos/, which tracksmain. The loader check above is the substantive half —syncmaterializes exactly what the loader finds.Summary by CodeRabbit